﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDB;
using System.Data.SqlClient;
using System.Data; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
namespace ForrajeriaDAL
{
    public class EdadeDAL : AccesoDAL, InterfazDAL<EdadesMO>
    {

        #region VARIABLES PARA STORED QUE MANEJA EL OBJETO DE DAL

        private static string insert = "Edades_INSERT_RETURN_Scalar";
        private static string delete = "Edades_DELETE";
        private static string update = "Edades_UPDATE";
        private static string all = "Edades_GetALL";

        #endregion

        private SqlCommand cmd; //var de comando sql


        #region Interfaz

        public List<EdadesMO> GetAll()
        {
            SqlDataReader reader = null;
            List<EdadesMO> lista = new List<EdadesMO>();
            try
            {
                cmd = new SqlCommand(all, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                opencon(); // abre coneccion 
                reader = cmd.ExecuteReader();
                while (reader.Read())
                { 

                    EdadesMO aux = new EdadesMO();
                    aux.CodigoEdad = int.Parse(reader["codigoEdad"].ToString());
                    aux.Descripcion = reader["descripcion"].ToString();
                    lista.Add(aux);

                }
                return lista;
            }
            catch (Exception ex)
            {
                closecon();// cierra conexion
                throw ex; //en caso que no pueda leer desde la base de datos tira el hacia la siguiente capa 
            }
            finally //finalmente cierro el reader que use para traer la consulta esto es importante ya que por alguna razon podria quedar abierto generando una conexion sin uso en la bd que estaria todo el tiempo abierta
            {
                closeReader(reader);
                closecon();// cierra conexion
            }
        }

        public void Adicionar(EdadesMO item)
        {
            try
            {
                cmd = new SqlCommand(insert, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                //Agregando parametro de direccion OUTPUT para el retorno del SP
                SqlParameter codigo = new SqlParameter("@codigoEdad", SqlDbType.Int);
                codigo.Direction = ParameterDirection.Output;

                //agregando parametro de Insercion necesario para el SP 
                cmd.Parameters.Add("@descripcion", SqlDbType.VarChar, 250).Value = item.Descripcion;
                cmd.Parameters.Add(codigo);

                opencon(); //abro conexion
                cmd.ExecuteNonQuery();
                closecon(); //cierra conexion
            }
            catch (SqlException ex)
            {
                closecon();
                throw ex;
            }
        }

        public void Eliminar(EdadesMO item)
        {
            try
            {
                cmd = new SqlCommand(delete, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@codigoEdad", SqlDbType.Int).Value = item.CodigoEdad;

                opencon();
                cmd.ExecuteNonQuery();
                closecon();
            }

            catch (SqlException ex)
            {
                closecon();
                throw ex;

            }

        }

        public void Actualizar(EdadesMO nuevoItem, EdadesMO origItem)
        {
            try
            {
                cmd = new SqlCommand(update, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@codigoEdad", SqlDbType.Int).Value = origItem.CodigoEdad;
                cmd.Parameters.Add("@descripcion", SqlDbType.VarChar, 10).Value = nuevoItem.Descripcion;

                opencon();
                cmd.ExecuteNonQuery();
                closecon();

            }
            catch (SqlException ex)
            {
                closecon();
                throw ex;
            }
        }

        #endregion
      
        #region "Singleton"

        private static EdadeDAL instance;

        private EdadeDAL()
            : base()
        {
            
        }


        public static EdadeDAL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new EdadeDAL();
                }
                return instance;
            }
        }

        #endregion

    }

}
